Для реализации поиска по названию документа и типу документа в NestJS, вы можете использовать параметры запроса (query parameters
). Это позволит передавать параметры name
и type_id
через строку запроса (например, /documents?name=example&type_id=1
).
Обновленный контроллер
Вот как можно обновить ваш контроллер для обработки этих параметров:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import { Controller, Get, Query, NotFoundException } from '@nestjs/common'; import { ApiOperation, ApiResponse } from '@nestjs/swagger'; import { DocumentsService } from './documents.service'; @Controller('documents') export class DocumentsController { constructor(private readonly documentsService: DocumentsService) {} @ApiOperation({ summary: 'Получить список документов по названию и типу' }) @ApiResponse({ status: 200, description: 'Документы успешно найдены.' }) @ApiResponse({ status: 404, description: 'Документы не найдены.' }) @Get() async findDocuments( @Query('name') name: string, @Query('type_id') typeId: number, ) { const documents = await this.documentsService.findDocuments(name, typeId); if (!documents || documents.length === 0) { throw new NotFoundException('Документы не найдены.'); } return documents; } } |
Обновленный сервис
В сервисе DocumentsService
нужно реализовать метод findDocuments
, который будет обрабатывать параметры name
и type_id
:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import { Injectable } from '@nestjs/common'; @Injectable() export class DocumentsService { private documents = [ // Пример данных { id: 1, name: 'Document 1', type_id: 1 }, { id: 2, name: 'Document 2', type_id: 2 }, { id: 3, name: 'Document 3', type_id: 1 }, ]; async findDocuments(name?: string, typeId?: number) { // Фильтрация документов по названию и типу return this.documents.filter((doc) => { const matchesName = name ? doc.name.includes(name) : true; const matchesType = typeId ? doc.type_id === typeId : true; return matchesName && matchesType; }); } } |
Объяснение кода
- Контроллер:
- Используется декоратор
@Query
для получения параметровname
иtype_id
из строки запроса. - Если документы не найдены, выбрасывается исключение
NotFoundException
.
- Используется декоратор
- Сервис:
- Метод
findDocuments
фильтрует массив документов по переданным параметрамname
иtype_id
. - Если параметры не переданы, фильтрация по соответствующему критерию пропускается.
- Метод
Пример запросов
- Поиск по названию документа:javascript
GET /documents?name=Document
- Поиск по типу документа:javascript
GET /documents?type_id=1
- Поиск по названию и типу:javascript
GET /documents?name=Document&type_id=1
- Если параметры не переданы, возвращаются все документы:javascript
GET /documents
Swagger-документация
Если вы используете @nestjs/swagger
, параметры запроса можно задокументировать с помощью декоратора @ApiQuery
:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import { ApiQuery } from '@nestjs/swagger'; @ApiOperation({ summary: 'Получить список документов по названию и типу' }) @ApiResponse({ status: 200, description: 'Документы успешно найдены.' }) @ApiResponse({ status: 404, description: 'Документы не найдены.' }) @ApiQuery({ name: 'name', required: false, description: 'Название документа' }) @ApiQuery({ name: 'type_id', required: false, description: 'Тип документа' }) @Get() async findDocuments( @Query('name') name: string, @Query('type_id') typeId: number, ) { const documents = await this.documentsService.findDocuments(name, typeId); if (!documents || documents.length === 0) { throw new NotFoundException('Документы не найдены.'); } return documents; } |
Результат
Теперь ваш API поддерживает поиск документов по названию и типу, а также предоставляет удобную документацию через Swagger. Если у вас есть дополнительные вопросы, дайте знать! 😊